﻿using System;
using System.Collections.Generic;
using System.Linq;
/// <summary>
/// 在二维平面上，有一个机器人从原点 (0, 0) 开始。
/// 给出它的移动顺序，判断这个机器人在完成移动后是否在 (0, 0) 处结束。
/// 移动顺序由字符串表示。字符 move[i] 表示其第 i 次移动。机器人的有效动作有 R（右），L（左），U（上）和 D（下）。
/// 如果机器人在完成所有动作后返回原点，则返回 true。否则，返回 false。
/// 注意：机器人“面朝”的方向无关紧要。 “R” 将始终使机器人向右移动一次，“L” 将始终向左移动等。此外，假设每次移动机器人的移动幅度相同。
/// </summary>
namespace _657_robot_return_to_origin
{
    class Program
    {
        static void Main (string[] args)
        {
            string moves = "RLURLDDRL";
            Console.WriteLine (JudgeCircle2 (moves));
        }

        // 硬算
        public static  bool JudgeCircle (string words)
        {
            if (words.Length % 2 != 0) return false; // 成对出现才会回到原点
            for (int i = 0;i < words.Length - 1;i++)
            {
                Search (ref words, ref i);
            }

            return words.Length == 0;
        }

        public static void Search(ref string moves,ref int num)
        {
            for (int i = num + 1;i < moves.Length;i++)
            {
                switch (moves[num])
                {
                    case 'L':
                        if(moves[i] == 'R')
                        {
                            moves = moves.Remove (num, 1);
                            moves = moves.Remove (i - 1, 1);
                            num--;
                            return;
                        }
                        break;
                    case 'R':
                        if (moves[i] == 'L')
                        {
                            moves = moves.Remove (num, 1);
                            moves = moves.Remove (i - 1, 1);
                            num--;
                            return;
                        }
                        break;
                    case 'U':
                        if (moves[i] == 'D')
                        {
                            moves = moves.Remove (num, 1);
                            moves = moves.Remove (i - 1, 1);
                            num--;
                            return;
                        }
                        break;
                    case 'D':
                        if (moves[i] == 'U')
                        {
                            moves = moves.Remove (num, 1);
                            moves = moves.Remove (i - 1, 1);
                            num--;
                            return;
                        }
                        break;
                }
            }
            return;
        }

        // 统计
        public static bool JudgeCircle1 (string words)
        {
            Dictionary<char, int> dic = new Dictionary<char, int> ();
            dic.Add ('R', 0); dic.Add ('L', 0); dic.Add ('U', 0); dic.Add ('D', 0);
            foreach (char item in words) dic[item]++;
            return dic['R'] == dic['L'] && dic['U'] == dic['D'];
        }

        public static bool JudgeCircle2(string words)
        {
            return words.Count (i => "R".Contains (i)) == words.Count (i => "L".Contains (i)) &&
                words.Count (i => "U".Contains (i)) == words.Count (i => "D".Contains (i));
        }
    }
}
